home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / dc1 / sym.c < prev    next >
C/C++ Source or Header  |  1997-09-09  |  7KB  |  231 lines

  1. /*
  2.  *    (c)Copyright 1992-1997 Obvious Implementations Corp.  Redistribution and
  3.  *    use is allowed under the terms of the DICE-LICENSE FILE,
  4.  *    DICE-LICENSE.TXT.
  5.  */
  6.  
  7. /*
  8.  *  SYM.C
  9.  *
  10.  *  Symbol Handler
  11.  */
  12.  
  13. #include "defs.h"
  14.  
  15. #define ResSymbol(name,lexid)        MakeSymbol(name, sizeof(name)-1, lexid, NULL)
  16. #define ResSymbol3(name,lexid,lexdata)    MakeSymbol(name, sizeof(name)-1, lexid, (void *)lexdata)
  17. #define ResType(name, type)        MakeSymbol(name, sizeof(name)-1, TokTypeId, type)
  18.  
  19. #define HSIZE    1024
  20. #define HMASK    (HSIZE-1)
  21.  
  22. #define XSIZE    16
  23. #define XMASK    (XSIZE-1)
  24.  
  25. static Symbol *SymHash[HSIZE];
  26. static Symbol *SymHashX[XSIZE];
  27.  
  28. Prototype void InitSym(int);
  29. Prototype Symbol *MakeSymbol(const char *, short, short, void *);
  30. Prototype Symbol *PragmaSymbol(char *, short);
  31. Prototype SemInfo *FindSymbolId(Symbol *, short);
  32.  
  33. Prototype long hash(const ubyte *, short);
  34.  
  35. void
  36. InitSym(int enab)
  37. {
  38.     static short Refs;
  39.  
  40.     if (enab == 1 && Refs++ == 0) {
  41.  
  42.     ResSymbol("sizeof",     TokSizeof);
  43.     ResSymbol("typeof",     TokTypeof);
  44.  
  45.     ResSymbol3("signed",        TokTypeQual,    TF_SIGNED);
  46.     ResSymbol3("unsigned",      TokTypeQual,    TF_UNSIGNED);
  47.     ResSymbol3("volatile",      TokTypeQual,    TF_VOLATILE);
  48.     ResSymbol3("const",         TokTypeQual,    TF_CONST);
  49.     ResSymbol3("static",        TokTypeQual,    TF_STATIC);
  50.     ResSymbol3("auto",          TokTypeQual,    TF_AUTO);
  51.     ResSymbol3("extern",        TokTypeQual,    TF_EXTERN);
  52.     ResSymbol3("register",      TokTypeQual,    TF_REGISTER);
  53.  
  54.     ResSymbol3("__autoinit",    TokTypeQual,    TF_AUTOINIT);
  55.     ResSymbol3("__autoexit",    TokTypeQual,    TF_AUTOEXIT);
  56.     ResSymbol3("__interrupt",   TokTypeQual,    TF_INTERRUPT);
  57.     ResSymbol3("__noprof",      TokTypeQual,    TF_NOPROF);
  58.     ResSymbol3("__regargs",     TokTypeQual,    TF_REGCALL);
  59.     /*
  60.      *  replaced with pragmas
  61.      * ResSymbol3("__libcall",     TokTypeQual,    TF_LIBCALL);
  62.      */
  63.     ResSymbol3("__stkargs",     TokTypeQual,    TF_STKCALL);
  64.     ResSymbol3("__stkcheck",    TokTypeQual,    TF_STKCHECK);
  65.     ResSymbol3("__nostkcheck",  TokTypeQual,    TF_NOSTKCHECK);
  66.     ResSymbol3("__unaligned",   TokTypeQual,    TF_UNALIGNED);
  67.     ResSymbol3("__near",        TokTypeQual,    TF_NEAR);
  68.     ResSymbol3("__far",         TokTypeQual,    TF_FAR);
  69.     ResSymbol3("__chip",        TokTypeQual,    TF_CHIP);
  70.     ResSymbol3("__aligned",     TokTypeQual,    TF_ALIGNED);
  71.     ResSymbol3("__geta4",       TokTypeQual,    TF_GETA4);
  72.     ResSymbol3("__saveds",      TokTypeQual,    TF_GETA4);
  73.  
  74.     ResSymbol3("__shared",      TokTypeQual,    TF_SHARED);
  75.     ResSymbol3("__config",      TokTypeQual,    TF_CONFIG);
  76. #ifdef DYNAMIC
  77.     ResSymbol3("__dynamic",     TokTypeQual,    TF_DYNAMIC);
  78. #endif
  79.     ResSymbol3("__asm",         TokTypeQual,    0);     /*  SAS/C compat */
  80.  
  81.     ResSymbol3("__D0",          TokRegQual,     RB_D0);
  82.     ResSymbol3("__D1",          TokRegQual,     RB_D1);
  83.     ResSymbol3("__D2",          TokRegQual,     RB_D2);
  84.     ResSymbol3("__D3",          TokRegQual,     RB_D3);
  85.     ResSymbol3("__D4",          TokRegQual,     RB_D4);
  86.     ResSymbol3("__D5",          TokRegQual,     RB_D5);
  87.     ResSymbol3("__D6",          TokRegQual,     RB_D6);
  88.     ResSymbol3("__D7",          TokRegQual,     RB_D7);
  89.     ResSymbol3("__A0",          TokRegQual,     RB_A0);
  90.     ResSymbol3("__A1",          TokRegQual,     RB_A1);
  91.     ResSymbol3("__A2",          TokRegQual,     RB_A2);
  92.     ResSymbol3("__A3",          TokRegQual,     RB_A3);
  93.     ResSymbol3("__A4",          TokRegQual,     RB_A4);
  94.     ResSymbol3("__A5",          TokRegQual,     RB_A5);
  95.     ResSymbol3("__A6",          TokRegQual,     RB_A6);
  96.     ResSymbol3("__A7",          TokRegQual,     RB_A7);
  97.  
  98.     ResSymbol3("__d0",          TokRegQual,     RB_D0);
  99.     ResSymbol3("__d1",          TokRegQual,     RB_D1);
  100.     ResSymbol3("__d2",          TokRegQual,     RB_D2);
  101.     ResSymbol3("__d3",          TokRegQual,     RB_D3);
  102.     ResSymbol3("__d4",          TokRegQual,     RB_D4);
  103.     ResSymbol3("__d5",          TokRegQual,     RB_D5);
  104.     ResSymbol3("__d6",          TokRegQual,     RB_D6);
  105.     ResSymbol3("__d7",          TokRegQual,     RB_D7);
  106.     ResSymbol3("__a0",          TokRegQual,     RB_A0);
  107.     ResSymbol3("__a1",          TokRegQual,     RB_A1);
  108.     ResSymbol3("__a2",          TokRegQual,     RB_A2);
  109.     ResSymbol3("__a3",          TokRegQual,     RB_A3);
  110.     ResSymbol3("__a4",          TokRegQual,     RB_A4);
  111.     ResSymbol3("__a5",          TokRegQual,     RB_A5);
  112.     ResSymbol3("__a6",          TokRegQual,     RB_A6);
  113.     ResSymbol3("__a7",          TokRegQual,     RB_A7);
  114.  
  115.     ResSymbol("break",          TokBreak);
  116.     ResSymbol("case",           TokCase);
  117.     ResSymbol("continue",       TokContinue);
  118.     ResSymbol("default",        TokDefault);
  119.     ResSymbol("do",             TokDo);
  120.     ResSymbol("else",           TokElse);
  121.     ResSymbol("for",            TokFor);
  122.     ResSymbol("goto",           TokGoto);
  123.     ResSymbol("if",             TokIf);
  124.     ResSymbol("return",         TokReturn);
  125.     ResSymbol("struct",         TokStruct);
  126.     ResSymbol("enum",           TokEnum);
  127.     ResSymbol("switch",         TokSwitch);
  128.     ResSymbol("union",          TokUnion);
  129.     ResSymbol("while",          TokWhile);
  130.     ResSymbol("typedef",        TokTypeDef);
  131.     ResSymbol("__breakpoint",   TokBreakPoint);
  132.  
  133.     ResType("void",     &VoidType);
  134.     ResType("char",     &CharType);
  135.     ResType("short",    &ShortType);
  136.     ResType("int",      &LongType);
  137.     ResType("long",     &LongType);
  138.     ResType("float",    &FloatType);
  139.     ResType("double",   &DoubleType);
  140.     }
  141.     if (enab == 0 && --Refs == 0) {
  142.     ;
  143.     }
  144. }
  145.  
  146. #ifdef NO_ASM
  147.  
  148. long
  149. hash(const ubyte *buf, short bytes)
  150. {
  151.     long v = 0x12ABE49F;
  152.  
  153.     while (bytes) {
  154.     --bytes;
  155.     v = (v >> 23) ^ (v << 5) ^ *buf;
  156.     ++buf;
  157.     }
  158.     return(v);
  159. }
  160.  
  161. #endif
  162.  
  163. /*
  164.  *  create symbol if it does not exist, return symbol if it does.  lexid
  165.  *  only applies when creating a new symbol.
  166.  */
  167.  
  168. Symbol *
  169. MakeSymbol(const char *name, short len, short lexid, void *lexdata)
  170. {
  171.     long hv = hash(name, len);
  172.     Symbol **psym = SymHash + (hv & HMASK);
  173.     Symbol *sym;
  174.  
  175.     for (sym = *psym; sym; sym = *psym) {
  176.     if (hv == sym->Hv && len == sym->Len && cmpmem(name, sym->Name, len) == 0) {
  177.         if ((sym->LexId & TOKF_PRIVATE) == 0)
  178.         break;
  179.     }
  180.     psym = &sym->Next;
  181.     }
  182.     if (sym == NULL) {
  183.     sym = AllocStructure(Symbol);
  184.     *psym = sym;
  185.     sym->Name = name;
  186.     sym->Hv = hv;
  187.     sym->Len = len;
  188.     sym->LexId = lexid;
  189.     sym->Data = lexdata;
  190.     ++SymAllocs;
  191.     }
  192.     return(sym);
  193. }
  194.  
  195. Symbol *
  196. PragmaSymbol(char *name, short len)
  197. {
  198.     long hv = hash(name, len);
  199.     Symbol **psym = SymHashX + (hv & XMASK);
  200.     Symbol *sym;
  201.  
  202.     for (sym = *psym; sym; sym = *psym) {
  203.     if (hv == sym->Hv && len == sym->Len && cmpmem(name, sym->Name, len) == 0)
  204.         break;
  205.     psym = &sym->Next;
  206.     }
  207.     if (sym == NULL) {
  208.     sym = AllocStructure(Symbol);
  209.     sym->Name = name;
  210.     sym->Hv = hv;
  211.     sym->Len = len;
  212.     *psym = sym;
  213.     ++SymAllocs;
  214.     }
  215.     return(sym);
  216. }
  217.  
  218.  
  219. SemInfo *
  220. FindSymbolId(Symbol *sym, short lexid)
  221. {
  222.     SemInfo *sem;
  223.  
  224.     for (sem = sym->SemBase; sem; sem = sem->Next) {
  225.     if (sem->LexId == lexid)
  226.         break;
  227.     }
  228.     return(sem);
  229. }
  230.  
  231.